Zapier 中的去重机制如何运作
Zapier 会自动对传入的触发器数据进行去重,从而确保 Zap 不会因相同数据而多次运行。以下是针对“New Item”(新项目)和“Updated Item”(更新项目)触发器的要求,以满足用户预期。
-
提供一个唯一的主键。 默认情况下,会使用键为
id
的字段作为主键。或者,如果您使用 CLI,您可以通过在outputFields
中启用primary
来选择其他字段作为主键。请参阅 CLI 文档中的更多信息。 -
按创建时间逆序排序。
API 端点必须以逆时间顺序返回新项目或更新项目的数组。
轮询 通常会返回许多结果,其中大部分是 Zapier 之前已经处理过的。由于 Zap 不应在您的应用中的项目出现在多个不同的轮询时多次触发,因此数据必须进行去重。
例如,假设您的“新项目”端点返回一个任务列表:
[
{
"id": 7,
"created": "Mon, 25 Jun 2023 16:41:54 -0400",
"list_id": 1,
"description": "integrate our api with zapier",
"complete": false
},
{
"id": 6,
"created": "Mon, 25 Jun 2023 16:41:45 -0400",
"list_id": 1,
"description": "get published in zapier library",
"complete": false
}
]
以下假设您使用默认主键,即 id
字段。当 Zap 首次启用时,Zapier 会向您的 API 发起初始调用以检索现有数据,并缓存并存储每个 id
字段在我们的数据库中。当 Zap 被关闭时,该列表会被清除。
激活的 Zap 会按间隔轮询(基于客户计划),并将 id
与之前见过的所有 id
进行比较,针对新项目触发,并更新已见 id
列表。
现在,假设用户创建了一个新任务:
[
{
"id": 8,
"created": "Mon, 25 Jun 2023 16:42:09 -0400",
"list_id": 1,
"description": "re-do our api to support webhooks",
"complete": false
},
{
"id": 7,
"created": "Mon, 25 Jun 2023 16:41:54 -0400",
"list_id": 1,
"description": "integrate our api with zapier",
"complete": false
},
{
"id": 6,
"created": "Mon, 25 Jun 2023 16:41:45 -0400",
"list_id": 1,
"description": "get published in zapier library",
"complete": false
}
]
在创建新任务后的下一次轮询中,您的 API 会返回所有任务,但只有 id
为 8
的任务会被视为新项目。该特定 JSON 对象会触发用户的 Zap,并执行用户定义的后续操作步骤。去重的核心在于,在该轮询中的其他 id
(如 6
和 7
)会被忽略,因为这些 id
在之前的轮询中已经出现过。
为了使去重机制正常工作,id
字段必须始终提供,并在结果中的所有项目中保持唯一。
您的 API 必须以逆时间顺序返回结果,以确保新/更新项目出现在第一页结果中,因为 Zapier 的轮询触发器不会自动获取额外页面。如果您的 API 默认以其他顺序列出项目,但支持排序,请在轮询请求中包含排序参数,以确保最新记录出现在第一页结果中。GitHub 是一个很好的例子,它支持按多个字段以 asc
或 desc
方向排序。
重新排序返回的项目
如果您的 API 无法以逆时间顺序返回结果,您可以使用 Code Mode 来进行额外的请求,如果必要。
一种可能的情景是:
- 获取第一页结果,其中包含最旧的项目,但也包括总页数。
- 获取最后一页结果,然后在返回数组前对这些项目进行逆序排序。
在自定义代码中添加额外请求时,所有请求和处理代码必须在 30 秒内完成。不推荐尝试获取所有页面的结果。
如果您的 API 返回的项目没有 id
字段,或者您正在添加“Updated Item”触发器,您将使用 Code Mode 来修改 API 响应。
自定义主键
在较旧的遗留 Zapier Web Builder 应用中,如果没有 id
,Zapier 会猜测哪些字段是唯一键。现在,您必须定义一个或多个字段作为主键。
默认情况下,如果没有 outputFields
中设置 primary: true
,Zapier 会使用键为 id
的字段作为主键。在这种情况下,id
字段是必需的。否则,您的触发器在运行时会出错。如果您的 API 项目有一个不同名称的唯一字段,请调整以下代码片段以确保测试通过:
// ...
let items = response.data.items; // 或 response.json.items,如果您使用的是 core v9 或更旧版本
return items.map((item) => {
item.id = item.contactId;
return item;
});
或者,如果您使用 CLI,您可以使用非 id
字段作为主键。请参阅 CLI 文档中的“如何工作去重?”部分 以获取示例代码。
Updated Item 触发器
在针对更新项目进行触发时,您需要定义用于去重的 id
字段。假设您的任务 API 有一个端点,可以按 updatedAt
以降序返回任务,这里是一个示例代码,用于将 updatedAt
值与 id
结合,从而让 Zapier 将新更新视为新项目。假设您已将 options
配置为适当的 API 请求 URL 和参数:
return z.request(options).then((response) => {
response.throwForStatus();
const results = response.json;
results.forEach(function(result) {
result.originalId = result.id;
result.id = result.id + '-' + result.updatedAt;
});
return results;
});
请注意,该代码在设置 id
为新组合值(每个任务的更新都是唯一的)前保留了原始 id
值。这有助于确保原始 ID 仍可用于其他目的,例如执行搜索或关联记录。
或者,如果您使用 CLI,您可以为 id
和 updatedAt
字段设置 primary: true
。请参阅 CLI 文档中的“如何工作去重?”部分 以获取示例代码。